source(file = "../scripts/micro_o2_jessica_phg.R")

Mise au point de la micro-électrode à oxygène

Test 1 à test 4 : apprentissage de la méthode

  • Début dans l’eau
  • Avancée progressive vers le coenasarc
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages --------------------------------------------------
filter(): dplyr, stats
lag():    dplyr, stats
a <- ggplot(data = t1) +
  geom_line(mapping = aes(x = time, y = O2)) +
  ylim(c(6,12))
b <- ggplot(data = t2) +
  geom_line(mapping = aes(x = time, y = O2)) +
  ylim(c(6,12))
c <- ggplot(data = t3) +
  geom_line(mapping = aes(x = time, y = O2)) +
  ylim(c(6,12))
d <- ggplot(data = t4) +
  geom_line(mapping = aes(x = time, y = O2)) +
  ylim(c(6,12))
library(ggpubr)
Le chargement a nécessité le package : magrittr

Attachement du package : ‘magrittr’

The following object is masked from ‘package:purrr’:

    set_names

The following object is masked from ‘package:tidyr’:

    extract
ggarrange(a,b,c,d)

Test de reproductibilité

mouv <- c(50, 125)
a <- ggplot(data = t4a) +
  geom_line(mapping = aes(x = time, y = O2)) + 
  ylim(5.8,9) +
  geom_vline(xintercept = mouv, color = mouv)
b <- ggplot(data = t4b) +
  geom_line(mapping = aes(x = time, y = O2)) + 
  ylim(5.8,9)+
  geom_vline(xintercept = mouv, color = mouv)
c <- ggplot(data = t4c) +
  geom_line(mapping = aes(x = time, y = O2)) + 
  ylim(5.8,9)+
  geom_vline(xintercept = mouv, color = mouv)
d <- ggplot(data = t4d) +
  geom_line(mapping = aes(x = time, y = O2)) + 
  ylim(5.8,9)+
  geom_vline(xintercept = mouv, color = mouv)
ggarrange(a,b,c,d, labels = "auto")

Test 5 à test 10 : premier test sur le profil à 100 PAR

#depart coenasarc
#500 micro du coanasarc
mouv <-c(25,50,75,100,125,200,225, 250, 275, 350, 375)
a <- ggplot(t5)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv)
mouv <-c(25,50,75,100,125,150, 175, 200, 225, 250)
b <- ggplot(t6)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv)  
mouv <-c(50,100,150,200, 250, 300, 350, 400, 450, 500, 550)
c <-ggplot(t8)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
mouv <-c(50,100,150,200, 250, 300, 350, 400, 450, 500, 550)
d <-ggplot(t9)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
mouv <-c(100,200,300, 400, 550)
e <- ggplot(t10)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
ggarrange(a,b,c,d,e, ncol = 2, nrow = 3, labels = "auto")

Test12 : premier profil 0 PAR

#mouv <-c(100,200,300, 400, 500)
#summary(t12)
a <- ggplot(t12,mapping = aes(x = time, y = O2))+
  geom_line() +
  xlim (c(0,550)) +
  geom_rect(xmin = 0, xmax = 100, ymin = 0, ymax = 9, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 200, xmax = 300, ymin = 0, ymax = 9, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 400, xmax = 500, ymin = 0, ymax = 9, fill = "red", alpha = 0.005)+
  annotate("text", x = c(50, 250, 450), y = 4.5, label = "0 mm") +
  annotate("text", x = c(150, 350, 530), y = 4.5, label = " + 0.1 mm")+
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous dans l'eau mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (0 mm) et distant de ce dernier (0.1mm) dans l'obscurité")+
  theme(plot.caption  = element_text(hjust = 0.5))
a

#ggsave(filename = "test12.png", plot = a, device = "png")

Test 13 à test 15

*idem manip test5 à test10

mouv <-c(50, 100, 150 ,200, 225, 250, 350, 400)
a <- ggplot(t13)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
mouv <-c(50, 100, 150 ,200, 250)
b <- ggplot(t14)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
mouv <-c(50, 100, 125, 175 ,225)
c <- ggplot(t15)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_vline(xintercept = mouv, color = mouv) 
ggarrange(a,b,c, labels = "auto")

Test16 : premier test lumière on/off

ggplot(t16)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 10, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 275, xmax = 525, ymin = 0, ymax = 10, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 50, xmax = 275, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  geom_rect(xmin = 525, xmax = 1000, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  annotate("text", x = c(175, 650), y = 3.8, label = "0 PAR") +
  annotate("text", x = c(0, 400), y = 3.8, label = " 100 PAR") +
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc lors de l'exposition à 0 PAR (bleu) et 100 PAR (rouge)")+
  theme(plot.caption  = element_text(hjust = 0.5))

#ggsave(filename = "test16.png", device = "png")

Test 17

ggplot(t17)+
  geom_line(mapping = aes(x = time, y = O2)) +
  geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "green",  alpha = 0.005)+
  geom_rect(xmin = 175, xmax = 200, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  geom_rect(xmin = 200, xmax = 300, ymin = 0, ymax = 10, fill = "red",  alpha = 0.005)+
  geom_rect(xmin = 300, xmax = 325, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  geom_rect(xmin = 325, xmax = 350, ymin = 0, ymax = 10, fill = "green",  alpha = 0.005)+
  geom_rect(xmin = 350, xmax = 375, ymin = 0, ymax = 10, fill = "blue",  alpha = 0.005)+
  geom_rect(xmin = 375, xmax = 1000, ymin = 0, ymax = 10, fill = "red",  alpha = 0.005)+
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (rouge), à 0.1 mm (bleu), 0.2 mm (vert) de ce dernier à 100 PAR.")+
  theme(plot.caption  = element_text(hjust = 0.5))

NA
a <- ggplot(t19)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005)+
  geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005)+
  geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005)+
  geom_rect(xmin = 175, xmax = 200, ymin = 0, ymax = 10, fill = "Yellow",  alpha = 0.005)+
  geom_rect(xmin = 200, xmax = 350, ymin = 0, ymax = 10, fill = "purple",  alpha = 0.005) +
  geom_rect(xmin = 350, xmax = 375, ymin = 0, ymax = 10, fill = "Yellow",  alpha = 0.005) +
  geom_rect(xmin = 375, xmax = 400, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005) +
  geom_rect(xmin = 400, xmax = 425, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005)+ 
  geom_rect(xmin = 425, xmax = 1000, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005) +
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")
b <- ggplot(t20)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005)+
  geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005)+
  geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005)+
  geom_rect(xmin = 175, xmax = 300, ymin = 0, ymax = 10, fill = "Yellow",  alpha = 0.005)+
  geom_rect(xmin = 300, xmax = 325, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005)+
  geom_rect(xmin = 325, xmax = 350, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005) +
  geom_rect(xmin = 350, xmax = 1000, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005) +
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")
library(ggpubr)
 a <- ggarrange(a,b, ncol = 2, labels = "auto")
 a + labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (rouge), à 0.1 mm (bleu), 0.2 mm (vert), 0.3 mm (jaune) et 0.4 (mauve) de ce dernier à 100 PAR, \n sur une zone fortement pigmentée (A) et faiblement pigmentée (B).")+
  theme(plot.caption  = element_text(hjust = 0.5, size = 10)) 

ggplot(t21)+
  geom_line(mapping = aes(x = time, y = O2))+
  geom_rect(xmin = -50, xmax = 150, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005)+
  geom_rect(xmin = 150, xmax = 200, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005)+
  geom_rect(xmin = 200, xmax = 250, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005)+
  geom_rect(xmin = 250, xmax = 300, ymin = 0, ymax = 10, fill = "Yellow",  alpha = 0.005)+
  geom_rect(xmin = 300, xmax = 350, ymin = 0, ymax = 10, fill = "purple",  alpha = 0.005) +
  geom_rect(xmin = 350, xmax = 500, ymin = 0, ymax = 10, fill = "sky blue",  alpha = 0.005) +
  geom_rect(xmin = 500, xmax = 550, ymin = 0, ymax = 10, fill = "purple",  alpha = 0.005) +
  geom_rect(xmin = 550, xmax = 600, ymin = 0, ymax = 10, fill = "Yellow",  alpha = 0.005) +
  geom_rect(xmin = 600, xmax = 650, ymin = 0, ymax = 10, fill = "Green",  alpha = 0.005) +
  geom_rect(xmin = 650, xmax = 700, ymin = 0, ymax = 10, fill = "Blue",  alpha = 0.005)+ 
  geom_rect(xmin = 700, xmax = 1000, ymin = 0, ymax = 10, fill = "Red",  alpha = 0.005) +
  labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")

#t22 on laisse sur le coté car demande bcp de temps pour une résultat qui montre que au bout de 50 sec à 0.1 on a pas atteint le plateau 

test distance par rapport au coenosarc

t23 <-microO2_import(file = "../data/T23/T232010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)236 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T23/T232010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T23/T232010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T23/T232010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T23/T232010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T23/T232010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t24 <-microO2_import(file = "../data/T24/T242010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)235 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T24/T242010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T24/T242010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T24/T242010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T24/T242010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T24/T242010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t25 <-microO2_import(file = "../data/T25/T252010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)151 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T25/T252010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T25/T252010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T25/T252010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T25/T252010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T25/T252010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t26 <-microO2_import(file = "../data/T26/T262010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)153 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T26/T262010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T26/T262010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T26/T262010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T26/T262010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T26/T262010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t27 <-microO2_import(file = "../data/T27/T272010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)219 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T27/T272010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T27/T272010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T27/T272010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T27/T272010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T27/T272010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t28 <-microO2_import(file = "../data/T28/T282010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)219 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T28/T282010.txt' file 2     2  <NA> 31 columns 30 columns '../data/T28/T282010.txt' row 3     3  <NA> 31 columns 30 columns '../data/T28/T282010.txt' col 4     4  <NA> 31 columns 30 columns '../data/T28/T282010.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T28/T282010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
ggplot(t23)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.5)

ggplot(t24)+
  geom_line(mapping = aes(x = time, y = O2))+
  annotate("rect", xmin = 3, xmax = 15, ymin = 8, ymax = 10, alpha = .2) +
  annotate("rect", xmin = 20, xmax = 35, ymin = 8, ymax = 10, alpha = .3)+
  annotate("rect", xmin = 40, xmax = 55, ymin = 8, ymax = 10, alpha = .4) +
  annotate("rect", xmin = 60, xmax = 75, ymin = 8, ymax = 10, alpha = .1, fill = "red")

ggplot(t25)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.005)

ggplot(t26)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.005)

dist <- data.frame(dist =  c(rep("0", 33), rep("0.1", 67), rep("0.2", 53)))
t26_test <- bind_cols(t26, dist)
library(dplyr)
t25%>%filter(O2 < 8 ) ->t26_a
t26%>%filter(O2 < 8 ) ->t26_a
ggplot(t26_a)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.005)

ggplot(t27)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.005)

ggplot(t28)+
  geom_line(mapping = aes(x = time, y = O2))+ 
  geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red",  alpha = 0.005)

test lumière ON/OFF sur coenosarc

ggplot(t29)+
  geom_line(mapping = aes(x = time, y = O2))

# ne donne pas grand chose d'exploitable
ggplot(t30)+
  geom_line(mapping = aes(x = time, y = O2))

# ne donne pas grand chose d'exploitable
t31 <-microO2_import(file = "../data/T31/T312710.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)913 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T31/T312710.txt' file 2     2  <NA> 31 columns 30 columns '../data/T31/T312710.txt' row 3     3  <NA> 31 columns 30 columns '../data/T31/T312710.txt' col 4     4  <NA> 31 columns 30 columns '../data/T31/T312710.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T31/T312710.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t34 <-microO2_import(file = "../data/T34/T342710.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
  .default = col_character(),
  `Time (HH:MM:SS)` = col_time(format = ""),
  `Time (s)` = col_double(),
  Ch1 = col_double(),
  `Ch 1` = col_double(),
  `(mbar)` = col_double(),
  `(%)` = col_double(),
  `Ch 1_1` = col_double(),
  Ch1_1 = col_double(),
  Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)647 parsing failures.
row # A tibble: 5 x 5 col     row   col   expected     actual                      file expected   <int> <chr>      <chr>      <chr>                     <chr> actual 1     1  <NA> 31 columns 30 columns '../data/T34/T342710.txt' file 2     2  <NA> 31 columns 30 columns '../data/T34/T342710.txt' row 3     3  <NA> 31 columns 30 columns '../data/T34/T342710.txt' col 4     4  <NA> 31 columns 30 columns '../data/T34/T342710.txt' expected 5     5  <NA> 31 columns 30 columns '../data/T34/T342710.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
library(tidyverse)
ggplot(t31)+
  geom_line(mapping = aes(x = time, y = O2))

t31%>%filter(time > 120 , time <200) -> t_test
ggplot(t_test)+
  geom_line(mapping = aes(x = time, y = O2))

ggplot(t_test)+
  geom_line(mapping = aes(x = time, y = log(O2)))

library("dplyr")
t_test%>%mutate(log_O2 = log(O2)) ->t_test
summary(lm. <- lm(log_O2 ~ time, data = t_test))

Call:
lm(formula = log_O2 ~ time, data = t_test)

Residuals:
       Min         1Q     Median         3Q        Max 
-0.0145563 -0.0112197 -0.0003336  0.0088456  0.0259999 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.0235323  0.0109269   276.7   <2e-16 ***
time        -0.0062713  0.0000678   -92.5   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01135 on 51 degrees of freedom
Multiple R-squared:  0.9941,    Adjusted R-squared:  0.994 
F-statistic:  8555 on 1 and 51 DF,  p-value: < 2.2e-16
lm. %>% (function(lm, model = lm[["model"]], vars = names(model))
  ggplot(model, aes_string(x = vars[2], y = vars[1])) +
    geom_point() + stat_smooth(method = "lm", formula = y ~ x))

lm. %>% qplot(.fitted, .resid, data = .) +
  geom_hline(yintercept = 0) +
  geom_smooth(se = FALSE) +
  xlab("Fitted values") +
  ylab("Residuals") +
  ggtitle("Residuals vs Fitted")

#plot(lm., which = 2)
lm. %>% qplot(sample = .stdresid, data = .) +
  geom_abline(intercept = 0, slope = 1, colour = "darkgray") +
  xlab("Theoretical quantiles") +
  ylab("Standardized residuals") +
  ggtitle("Normal Q-Q")

#plot(lm., which = 3)
lm. %>% qplot(.fitted, sqrt(abs(.stdresid)), data = .) +
  geom_smooth(se = FALSE) +
  xlab("Fitted values") +
  ylab(expression(bold(sqrt(abs("Standardized residuals"))))) +
  ggtitle("Scale-Location")

ggplot(t34)+
  geom_line(mapping = aes(x = time, y = O2))

ggplot(t35)+
  geom_line(mapping = aes(x = time, y = O2))

#ggplot(t36)+
#  geom_line(mapping = aes(x = time, y = O2))
ggplot(t37)+
  geom_line(mapping = aes(x = time, y = O2))

ggplot(t38)+
  geom_line(mapping = aes(x = time, y = O2))

ggplot(t39)+
  geom_line(mapping = aes(x = time, y = O2))

L’expérience recommence à zéro

Après s’être apperçu que l’on déplaçait la sonde de 1mm au lieu de 100 \(\mu m\), on relance l’expérience

t40 <-microO2_import2(file = "../data/T40/T40.txt")
t42 <-microO2_import2(file = "../data/T42/T420311.txt")
library(tidyverse)
ggplot(t40)+
  geom_line(mapping = aes(x = temps, y = O2))

Première critique de l’expérience, on peut observer que nous avons une première partie du graphique continu sur environ 300 seconde ( et donc \(200 \mu m\))qui pourrait être interprété comme une couche d’eau stagnante entourant le corail. L’étape suivante est de réaliser à nouveau cette expérience et de la faire dans le sens contraire pour avancer vers le corail

t42%>%filter(temps < 720)->t42
ggplot(t42)+
  geom_line(mapping = aes(x = temps, y = O2))+
  geom_vline(xintercept = c(500, 720))

Première remarque sur l’expérience en partant du milieu et en avancant vers le coenosarc, on observe un augmentation progressive de l’oxygène puis on atteint un premier plateau lorsque la sonde touche le coenosarc et que la concentration réaugmente lorsque l’on touche pénetre les tissus. Il semble cependat qu’un sorte de couche stable se situa à proximité du coenosarc ( touche au visuelle à 500 secondes)

t43 <-microO2_import2(file = "../data/T43/T430311.txt")
t43$num <-as.numeric(t43$Date)
library(readr)
library(tidyverse)
T430311_light <- read_csv("../data/T43/T430311_light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
T430311_light%>%rename(Date = time)->T430311_light
T430311_light$num <-as.numeric(T430311_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t43_test <- left_join(t43, T430311_light, by = "num")
#View(T430311_light)
library(lubridate)

Attachement du package : ‘lubridate’

The following object is masked from ‘package:base’:

    date
T430311_light %>% separate(col = Date,into = c("year", "hour"), sep = " ", remove = FALSE) -> T430311_light
t43 %>% separate(col = Date,into = c("year", "hour"), sep = " ", remove = FALSE) -> t43
t43_test <- left_join(t43, T430311_light, by = "hour")
t43_test %>% fill(light , .direction = "down")->t43_test
t43_test$light[is.na(t43_test$light)] <- 1
t43_test$light <- as.factor(t43_test$light)
ggplot(data = t43_test, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1)) +
  theme_bw()

t45 <-microO2_import2(file = "../data/T45/T450711.txt")
t46 <-microO2_import2(file = "../data/T46/T460711.txt")
t45 <-microO2_import2(file = "../data/T45/T450711.txt")
t53 <-microO2_import2(file = "../data/T53/T531011.txt")
t54 <-microO2_import2(file = "../data/T54/T541011.txt")
t55 <-microO2_import2(file = "../data/T55/T551011.txt")
t57 <-microO2_import2(file = "../data/T57/T571311.txt")
t58 <-microO2_import2(file = "../data/T58/T581311.txt")
t60 <-microO2_import2(file = "../data/T60/T601311.txt")
t61 <-microO2_import2(file = "../data/T61/T611311.txt")
library(tidyverse)
ggplot(t45)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t46)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t53)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t54)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t55)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t57)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t58)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t60)+
  geom_line(mapping = aes(x = temps, y = O2))

ggplot(t61)+
  geom_line(mapping = aes(x = temps, y = O2))+
  theme_bw()

Expérience du 11 décembre 2017

On observe que l’utilisation d’une nouvelle microélectrode permet d’obtenir un signal plus nette.

Experience 70

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t70 <-microO2_import2(file = "../data/T70/T701112.txt")
#creation d'une nouvelle variable en character
t70$time <-as.character(t70$Date)
#importation et transfo de la date 
T70_light <- read_csv("../data/T70/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
T70_light%>%rename(Date = time)->T70_light
T70_light$time <- as.character(T70_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t70_comb <- left_join(t70, T70_light, by = "time")
t70_comb %>% fill(light , .direction = "down")->t70_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t70_comb$light[is.na(t70_comb$light)] <- 1
t70_comb$light <- as.factor(t70_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t70_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

  • On a un beau signal
  • On peut réduire le temps avant de débuter la manip à 20 secondes et plus 50 secondes
  • On peut réduire le temps d’éclairage à 15 secondes et plus 30 secondes

71

  • perte du fichier sur la lumière
#importation
t71 <-microO2_import2(file = "../data/T71/T711112.txt")
ggplot(data = t71, mapping = aes(x = temps, y = O2))+
  geom_line()

72

  • Il y a un probleme entre l’eclairage et la microélectrode à voir
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t72 <-microO2_import2(file = "../data/t72/t721112.txt")
#creation d'une nouvelle variable en character
t72$time <-as.character(t72$Date)
#importation et transfo de la date 
t72_light <- read_csv("../data/t72/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t72_light%>%rename(Date = time)->t72_light
t72_light$time <- as.character(t72_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t72_comb <- left_join(t72, t72_light, by = "time")
t72_comb %>% fill(light , .direction = "down")->t72_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t72_comb$light[is.na(t72_comb$light)] <- 1
t72_comb$light <- as.factor(t72_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t72_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t73 <-microO2_import2(file = "../data/t73/t731112.txt")
#creation d'une nouvelle variable en character
t73$time <-as.character(t73$Date)
#importation et transfo de la date 
t73_light <- read_csv("../data/t73/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t73_light%>%rename(Date = time)->t73_light
t73_light$time <- as.character(t73_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t73_comb <- left_join(t73, t73_light, by = "time")
t73_comb %>% fill(light , .direction = "down")->t73_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t73_comb$light[is.na(t73_comb$light)] <- 1
t73_comb$light <- as.factor(t73_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t73_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t74

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t74 <-microO2_import2(file = "../data/t74/t741112.txt")
#creation d'une nouvelle variable en character
t74$time <-as.character(t74$Date)
#importation et transfo de la date 
t74_light <- read_csv("../data/t74/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t74_light%>%rename(Date = time)->t74_light
t74_light$time <- as.character(t74_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t74_comb <- left_join(t74, t74_light, by = "time")
t74_comb %>% fill(light , .direction = "down")->t74_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t74_comb$light[is.na(t74_comb$light)] <- 1
t74_comb$light <- as.factor(t74_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t74_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t75

  • erreur sur la représentation graphique , je ne vois pas comment corriger cela
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t75 <-microO2_import2(file = "../data/t75/t751112.txt")
#creation d'une nouvelle variable en character
t75$time <-as.character(t75$Date)
#importation et transfo de la date 
t75_light <- read_csv("../data/t75/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t75_light%>%rename(Date = time)->t75_light
t75_light%>%mutate(Date = Date + 1) -> t75_light
t75_light$time <- as.character(t75_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t75_comb <- left_join(t75, t75_light, by = "time")
t75_comb %>% fill(light , .direction = "down")->t75_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t75_comb$light[is.na(t75_comb$light)] <- 1
t75_comb$light <- as.factor(t75_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t75_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t76

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t76 <-microO2_import2(file = "../data/t76/t761112.txt")
#creation d'une nouvelle variable en character
t76$time <-as.character(t76$Date)
#importation et transfo de la date 
t76_light <- read_csv("../data/t76/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t76_light%>%rename(Date = time)->t76_light
#t76_light%>%mutate(Date = Date + 1) -> t76_light
t76_light$time <- as.character(t76_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t76_comb <- left_join(t76, t76_light, by = "time")
t76_comb %>% fill(light , .direction = "down")->t76_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t76_comb$light[is.na(t76_comb$light)] <- 1
t76_comb$light <- as.factor(t76_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t76_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t77

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t77 <-microO2_import2(file = "../data/t77/t771112.txt")
#creation d'une nouvelle variable en character
t77$time <-as.character(t77$Date)
#importation et transfo de la date 
t77_light <- read_csv("../data/t77/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t77_light%>%rename(Date = time)->t77_light
#t77_light%>%mutate(Date = Date + 1) -> t77_light
t77_light$time <- as.character(t77_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t77_comb <- left_join(t77, t77_light, by = "time")
t77_comb %>% fill(light , .direction = "down")->t77_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t77_comb$light[is.na(t77_comb$light)] <- 1
t77_comb$light <- as.factor(t77_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t77_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t78

  • Je n’ai pas de fichier sur la lumière
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t78 <-microO2_import2(file = "../data/t78/t781112.txt")
#creation d'une nouvelle variable en character
t78$time <-as.character(t78$Date)
#importation et transfo de la date 
t78_light <- read_csv("../data/t78/light.csv")
Erreur : '../data/t78/light.csv' does not exist in current working directory ('/Users/engels/Documents/garrido_jessica_memoire_2017_2018/analyse_micro_elect/rapports').

Expérience du 12 décembre 2017

t79

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t79 <-microO2_import2(file = "../data/t79/t791212.txt")
#creation d'une nouvelle variable en character
t79$time <-as.character(t79$Date)
#importation et transfo de la date 
t79_light <- read_csv("../data/t79/light.csv")
Parsed with column specification:
cols(
  time = col_datetime(format = ""),
  light = col_integer()
)
t79_light%>%rename(Date = time)->t79_light
#t79_light%>%mutate(Date = Date + 1) -> t79_light
t79_light$time <- as.character(t79_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t79_comb <- left_join(t79, t79_light, by = "time")
t79_comb %>% fill(light , .direction = "down")->t79_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t79_comb$light[is.na(t79_comb$light)] <- 1
t79_comb$light <- as.factor(t79_comb$light)
# petit graphique des données avec la lumière 
ggplot(data = t79_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t80

#package employé durant l'analyse

library(readr)
library(tidyverse)

#importation
t80 <-microO2_import2(file = "../data/t80/t801212.txt")
#creation d'une nouvelle variable en character
t80$time <-as.character(t80$Date)

#importation et transfo de la date 
t80_light <- read_csv("../data/t80/light.csv")
t80_light%>%rename(Date = time)->t80_light
#t80_light%>%mutate(Date = Date + 1) -> t80_light
t80_light$time <- as.character(t80_light$Date)


#objectif faire coller le document sur le temps et le document sur l'éclairage
t80_comb <- left_join(t80, t80_light, by = "time")
t80_comb %>% fill(light , .direction = "down")->t80_comb

#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t80_comb$light[is.na(t80_comb$light)] <- 1
t80_comb$light <- as.factor(t80_comb$light)

# petit graphique des données avec la lumière 
ggplot(data = t80_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t81

t82

#package employé durant l'analyse

library(readr)
library(tidyverse)

#importation
t82 <-microO2_import2(file = "../data/t82/t821212.txt")
#creation d'une nouvelle variable en character
t82$time <-as.character(t82$Date)

#importation et transfo de la date 
t82_light <- read_csv("../data/t82/light.csv")
t82_light%>%rename(Date = time)->t82_light
#t82_light%>%mutate(Date = Date + 1) -> t82_light
t82_light$time <- as.character(t82_light$Date)


#objectif faire coller le document sur le temps et le document sur l'éclairage
t82_comb <- left_join(t82, t82_light, by = "time")
t82_comb %>% fill(light , .direction = "down")->t82_comb

#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t82_comb$light[is.na(t82_comb$light)] <- 1
t82_comb$light <- as.factor(t82_comb$light)

# petit graphique des données avec la lumière 
ggplot(data = t82_comb, mapping = aes(x = temps, y = O2, color = light))+
  geom_line(aes(group = 1))

t87 Vérification du profil en oxygène

t87 <-microO2_import2(file = "../data/t87/t871912.txt")
library(tidyverse)
ggplot(t87, mapping = aes(x = temps, y = O2))+
  geom_line()

(max(t87$temps))/15
[1] 12.96133
N <- 10
pas_de_distance <- 40
distance_initiale <- -400
pas_de_temps <- 15
temps_initiale <-26
n <-c(0:N)
dist <- data_frame(n = n)
dist%>% mutate(temps = (n*pas_de_temps)+temps_initiale)->dist
dist%>%mutate(distance = (n*pas_de_distance)+distance_initiale)->dist
t87$temps <- round(t87$temps, digits = 0)
t87<- left_join(t87, dist, by = "temps")
t87 <- tidyr::fill(t87, distance, .direction = "down") 
ggplot(t87, mapping = aes(x = distance, y = O2))+
  geom_line()+
  geom_smooth()

t88 Vérifiaction du profil suite de t77

library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ------------------------------------------------------------------------------
filter(): dplyr, stats
lag():    dplyr, stats

t89 variation de l’intensité de la lumière

LS0tCnRpdGxlOiAiQW5hbHlzZSBkZXMgcsOpc3VsdGF0cyBvYnRlbnVzIGF2ZWMgbGEgbWljcm8tw6lsZWN0cm9kZSDDoCBveHlnw6huZSIKYXV0aG9yOiAiSmVzc2ljYSBTYXZlIEdhcnJpZG8gJiBFbmdlbHMgR3V5bGlhbm4iCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKYWJzdHJhY3Q6IFRyYWl0ZW1lbnQgZ8OpbsOpcmF1eCBkZSBsJ2Vuc2VtYmxlIGRlcyBhbmFseXNlcyByw6lhbGlzw6llcyBkYW5zIGxlIGNhZHJlIGR1CiAgVEZFIGRlIEplc3NpY2EgU2F2ZSBHYXJyaWRvIHBvcnRhbnQgc3VyIGwnaW1wYWN0IGQndW4gc3RyZXNzIHRoZXJtaXF1ZSBzdXIgbGEgcGhvdG9zeW50aMOoc2UKLS0tCgoKCmBgYHtyfQpzb3VyY2UoZmlsZSA9ICIuLi9zY3JpcHRzL21pY3JvX28yX2plc3NpY2FfcGhnLlIiKQpgYGAKCgojIE1pc2UgYXUgcG9pbnQgZGUgbGEgbWljcm8tw6lsZWN0cm9kZSDDoCBveHlnw6huZQoKCiMjIFRlc3QgMSDDoCB0ZXN0IDQgOiBhcHByZW50aXNzYWdlIGRlIGxhIG3DqXRob2RlCgoKKiBEw6lidXQgZGFucyBsJ2VhdSAKKiBBdmFuY8OpZSBwcm9ncmVzc2l2ZSB2ZXJzIGxlIGNvZW5hc2FyYwoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMS9UMTEyMTAudHh0IikKdDIgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDIvVDIxMjEwLnR4dCIpCnQzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzL1QzMTIxMC50eHQiKQp0NCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfQS50eHQiKQpgYGAKCmBgYHtyfQoKbGlicmFyeSh0aWR5dmVyc2UpCgphIDwtIGdncGxvdChkYXRhID0gdDEpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIHlsaW0oYyg2LDEyKSkKYiA8LSBnZ3Bsb3QoZGF0YSA9IHQyKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpICsKICB5bGltKGMoNiwxMikpCmMgPC0gZ2dwbG90KGRhdGEgPSB0MykgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSArCiAgeWxpbShjKDYsMTIpKQpkIDwtIGdncGxvdChkYXRhID0gdDQpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIHlsaW0oYyg2LDEyKSkKCmxpYnJhcnkoZ2dwdWJyKQoKZ2dhcnJhbmdlKGEsYixjLGQpCmBgYAoKIyBUZXN0IGRlIHJlcHJvZHVjdGliaWxpdMOpCgoqIHLDqWFsaXNlciA0IG1lc3VyZXMgcmVwcm9kdWN0aWJsZSBzdXIgZGlmZsOpcmVudGVzIHpvbmVzIGRlIGxhIGJvdXR1cmUKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnQ0YSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfQS50eHQiKQp0NGIgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDQvVDQxMjEwX0IudHh0IikKdDRjIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q0L1Q0MTIxMF9DLnR4dCIpCnQ0ZCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfRC50eHQiKQpgYGAKIAogKiAwLTUwIGRhbnMgbCdlYXUKICogNTAtMTI1IHBsYWNlbWVudCBzdXIgbGUgY29lbmFzYXJjCiAqIDEyNS0uLi4gcmV0b3VyIGRhbnMgbCdlYXUKIApgYGB7cn0KCm1vdXYgPC0gYyg1MCwgMTI1KQoKYSA8LSBnZ3Bsb3QoZGF0YSA9IHQ0YSkgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSArIAogIHlsaW0oNS44LDkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmIgPC0gZ2dwbG90KGRhdGEgPSB0NGIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmMgPC0gZ2dwbG90KGRhdGEgPSB0NGMpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmQgPC0gZ2dwbG90KGRhdGEgPSB0NGQpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCgpnZ2FycmFuZ2UoYSxiLGMsZCwgbGFiZWxzID0gImF1dG8iKQpgYGAKCgojIFRlc3QgNSDDoCB0ZXN0IDEwIDogcHJlbWllciB0ZXN0IHN1ciBsZSBwcm9maWwgw6AgMTAwIFBBUgoKKiBWYXJpYXRpb24gZHUgdGVtcHMgcG91ciBkw6l0ZXJtaW5lciBsZXMgdmFyaWF0aW9ucyBkdSBwcm9maWwKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnQ1IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q1L1Q1MTIxMC50eHQiKQp0NiA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNi9UNjEyMTAudHh0IikKI3Q3IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q3L1Q3MTIxMC50eHQiKQogICNyZWpldGVyIGNhciBlcnJldXIgOiBwYXMgdG9wIGF2ZWMgbW91dmVtZW50IGRlIGxhIG1pY3Jvc29uZGUKdDggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDgvVDgxMzEwLnR4dCIpCnQ5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q5L1Q5MTMxMC50eHQiKQp0MTAgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDEwL1QxMDEzMTAudHh0IikKI3QxMSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMTAvVDExMTMxMC50eHQiKQpgYGAKCmBgYHtyfQojZGVwYXJ0IGNvZW5hc2FyYwojNTAwIG1pY3JvIGR1IGNvYW5hc2FyYwptb3V2IDwtYygyNSw1MCw3NSwxMDAsMTI1LDIwMCwyMjUsIDI1MCwgMjc1LCAzNTAsIDM3NSkKYSA8LSBnZ3Bsb3QodDUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCgptb3V2IDwtYygyNSw1MCw3NSwxMDAsMTI1LDE1MCwgMTc1LCAyMDAsIDIyNSwgMjUwKQpiIDwtIGdncGxvdCh0NikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1vdXYsIGNvbG9yID0gbW91dikgIAoKbW91diA8LWMoNTAsMTAwLDE1MCwyMDAsIDI1MCwgMzAwLCAzNTAsIDQwMCwgNDUwLCA1MDAsIDU1MCkKYyA8LWdncGxvdCh0OCkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1vdXYsIGNvbG9yID0gbW91dikgCgptb3V2IDwtYyg1MCwxMDAsMTUwLDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTAsIDUwMCwgNTUwKQpkIDwtZ2dwbG90KHQ5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCm1vdXYgPC1jKDEwMCwyMDAsMzAwLCA0MDAsIDU1MCkKZSA8LSBnZ3Bsb3QodDEwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCmdnYXJyYW5nZShhLGIsYyxkLGUsIG5jb2wgPSAyLCBucm93ID0gMywgbGFiZWxzID0gImF1dG8iKQpgYGAKCiMgVGVzdDEyIDogcHJlbWllciBwcm9maWwgMCBQQVIKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDEyIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxMi9UMTIxMzEwLnR4dCIpCmBgYAoKCiogQWRhcHRhdGlvbiA1IG1pbiBkYW5zIGxlIG5vaXIKKiBkZXBhcnQgY29lbmFzYXJjIAoqIGZpbiAxMDAgJFxtdSBtJCAKCgpgYGB7cn0KI21vdXYgPC1jKDEwMCwyMDAsMzAwLCA0MDAsIDUwMCkKI3N1bW1hcnkodDEyKQphIDwtIGdncGxvdCh0MTIsbWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkgKwogIHhsaW0gKGMoMCw1NTApKSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAwLCB4bWF4ID0gMTAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMjAwLCB4bWF4ID0gMzAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gNDAwLCB4bWF4ID0gNTAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjAwNSkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYyg1MCwgMjUwLCA0NTApLCB5ID0gNC41LCBsYWJlbCA9ICIwIG1tIikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMTUwLCAzNTAsIDUzMCksIHkgPSA0LjUsIGxhYmVsID0gIiArIDAuMSBtbSIpKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIGRhbnMgbCdlYXUgbWVzdXLDqWUgYXZlYyB1bmUgbWljcm/DqWxlY3Ryb2RlIMOgIG94eWfDqG5lIHBsYWPDqWUgXG4gc3VyIGxlIGNvZW5vc2FyYyAoMCBtbSkgZXQgZGlzdGFudCBkZSBjZSBkZXJuaWVyICgwLjFtbSkgZGFucyBsJ29ic2N1cml0w6kiKSsKICB0aGVtZShwbG90LmNhcHRpb24gID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYQojZ2dzYXZlKGZpbGVuYW1lID0gInRlc3QxMi5wbmciLCBwbG90ID0gYSwgZGV2aWNlID0gInBuZyIpCmBgYAoKKiBVdGlsaXNhdGlvbiBwb3RlbnRpZWwgcG91ciByw6lhbGlzZXIgZGVzIHLDqWdyZXNzaW9ucyBsaW7DqWFpcmVzCgoKIyBUZXN0IDEzIMOgIHRlc3QgMTUgCgoqaWRlbSBtYW5pcCB0ZXN0NSDDoCB0ZXN0MTAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDEzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxMy9UMTMxODEwLnR4dCIpCnQxNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMTQvVDE0MTgxMC50eHQiKQp0MTUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE1L1QxNTE4MTAudHh0IikKYGBgCmBgYHtyfQptb3V2IDwtYyg1MCwgMTAwLCAxNTAgLDIwMCwgMjI1LCAyNTAsIDM1MCwgNDAwKQphIDwtIGdncGxvdCh0MTMpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpIAptb3V2IDwtYyg1MCwgMTAwLCAxNTAgLDIwMCwgMjUwKQpiIDwtIGdncGxvdCh0MTQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpIAoKbW91diA8LWMoNTAsIDEwMCwgMTI1LCAxNzUgLDIyNSkKYyA8LSBnZ3Bsb3QodDE1KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCmdnYXJyYW5nZShhLGIsYywgbGFiZWxzID0gImF1dG8iKQpgYGAKCiogbG9ycyBkdSBwbGFjZW1lbnQgc3VyIGxlIGNvZW5hc2FyYywgb24gbidvYnRpZW5zIHBhcyBkZXV4IHN1Y2Nlc3NpdmVtZW50cyBsZXMgbcOqbWVzIGRvbm7DqWVzCgoKIyBUZXN0MTYgIDogcHJlbWllciB0ZXN0IGx1bWnDqHJlIG9uL29mZgoKKiBzb25kZSBwbGFjw6llIHN1ciBsZSBjb2VuYXNhcmMKKiB0ZW1wcyBub24gZMOpdGVybWluw6kgbWFpcyBzdXIgcGxhdGVhdSBncmFwaGlxdWUgZHUgcHJvZ3JhbW1lIGRlIGxhIHNvbmRlIAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MTYgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE2L1QxNjE4MTAudHh0IikKYGBgCgoKYGBge3J9CmdncGxvdCh0MTYpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInJlZCIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDI3NSwgeG1heCA9IDUyNSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJyZWQiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSA1MCwgeG1heCA9IDI3NSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gNTI1LCB4bWF4ID0gMTAwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMTc1LCA2NTApLCB5ID0gMy44LCBsYWJlbCA9ICIwIFBBUiIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSBjKDAsIDQwMCksIHkgPSAzLjgsIGxhYmVsID0gIiAxMDAgUEFSIikgKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIG1lc3Vyw6llIGF2ZWMgdW5lIG1pY3Jvw6lsZWN0cm9kZSDDoCBveHlnw6huZSBwbGFjw6llIFxuIHN1ciBsZSBjb2Vub3NhcmMgbG9ycyBkZSBsJ2V4cG9zaXRpb24gw6AgMCBQQVIgKGJsZXUpIGV0IDEwMCBQQVIgKHJvdWdlKSIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiAgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQojZ2dzYXZlKGZpbGVuYW1lID0gInRlc3QxNi5wbmciLCBkZXZpY2UgPSAicG5nIikKYGBgCgojIFRlc3QgMTcKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDE3IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxNy9UMTcyMDEwLnR4dCIpCgp0MTkgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE5L1QxOTIwMTAudHh0IikKCnQyMCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjAvVDIwMjAxMC50eHQiKQoKdDIxIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyMS9UMjEyMDEwLnR4dCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QodDE3KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIGdlb21fcmVjdCh4bWluID0gLTUwLCB4bWF4ID0gMTI1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInJlZCIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDEyNSwgeG1heCA9IDE1MCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTUwLCB4bWF4ID0gMTc1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImdyZWVuIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTc1LCB4bWF4ID0gMjAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyMDAsIHhtYXggPSAzMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMzAwLCB4bWF4ID0gMzI1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMjUsIHhtYXggPSAzNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiZ3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAzNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiYmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDM3NSwgeG1heCA9IDEwMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIG1lc3Vyw6llIGF2ZWMgdW5lIG1pY3Jvw6lsZWN0cm9kZSDDoCBveHlnw6huZSBwbGFjw6llIFxuIHN1ciBsZSBjb2Vub3NhcmMgKHJvdWdlKSwgw6AgMC4xIG1tIChibGV1KSwgMC4yIG1tICh2ZXJ0KSBkZSBjZSBkZXJuaWVyIMOgIDEwMCBQQVIuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uICA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCiAgCgoKYGBgCgpgYGB7cn0KYSA8LSBnZ3Bsb3QodDE5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSAxMjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTI1LCB4bWF4ID0gMTUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIkJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxNTAsIHhtYXggPSAxNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxNzUsIHhtYXggPSAyMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMjAwLCB4bWF4ID0gMzUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAzNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpICsKICBnZW9tX3JlY3QoeG1pbiA9IDM3NSwgeG1heCA9IDQwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA0MDAsIHhtYXggPSA0MjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSA0MjUsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQpiIDwtIGdncGxvdCh0MjApKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDEyNSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJSZWQiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxMjUsIHhtYXggPSAxNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDE1MCwgeG1heCA9IDE3NSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDE3NSwgeG1heCA9IDMwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJZZWxsb3ciLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMDAsIHhtYXggPSAzMjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMjUsIHhtYXggPSAzNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQoKbGlicmFyeShnZ3B1YnIpCiBhIDwtIGdnYXJyYW5nZShhLGIsIG5jb2wgPSAyLCBsYWJlbHMgPSAiYXV0byIpCiBhICsgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiLCBjYXB0aW9uID0gIlZhcmlhdGlvbiBkZSBsJ294eWfDqG5lIGRpc3NvdXMgbWVzdXLDqWUgYXZlYyB1bmUgbWljcm/DqWxlY3Ryb2RlIMOgIG94eWfDqG5lIHBsYWPDqWUgXG4gc3VyIGxlIGNvZW5vc2FyYyAocm91Z2UpLCDDoCAwLjEgbW0gKGJsZXUpLCAwLjIgbW0gKHZlcnQpLCAwLjMgbW0gKGphdW5lKSBldCAwLjQgKG1hdXZlKSBkZSBjZSBkZXJuaWVyIMOgIDEwMCBQQVIsIFxuIHN1ciB1bmUgem9uZSBmb3J0ZW1lbnQgcGlnbWVudMOpZSAoQSkgZXQgZmFpYmxlbWVudCBwaWdtZW50w6llIChCKS4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTApKSAKYGBgCgoKCmBgYHtyfQpnZ3Bsb3QodDIxKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSAxNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTUwLCB4bWF4ID0gMjAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIkJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyMDAsIHhtYXggPSAyNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyNTAsIHhtYXggPSAzMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMzAwLCB4bWF4ID0gMzUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSA1MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAic2t5IGJsdWUiLCAgYWxwaGEgPSAwLjAwNSkgKwogIGdlb21fcmVjdCh4bWluID0gNTAwLCB4bWF4ID0gNTUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA1NTAsIHhtYXggPSA2MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpICsKICBnZW9tX3JlY3QoeG1pbiA9IDYwMCwgeG1heCA9IDY1MCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA2NTAsIHhtYXggPSA3MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSA3MDAsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQojdDIyIG9uIGxhaXNzZSBzdXIgbGUgY290w6kgY2FyIGRlbWFuZGUgYmNwIGRlIHRlbXBzIHBvdXIgdW5lIHLDqXN1bHRhdCBxdWkgbW9udHJlIHF1ZSBhdSBib3V0IGRlIDUwIHNlYyDDoCAwLjEgb24gYSBwYXMgYXR0ZWludCBsZSBwbGF0ZWF1IApgYGAKCgojIHRlc3QgZGlzdGFuY2UgcGFyIHJhcHBvcnQgYXUgY29lbm9zYXJjCgpgYGB7cn0KdDIzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyMy9UMjMyMDEwLnR4dCIpCnQyNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjQvVDI0MjAxMC50eHQiKQp0MjUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDI1L1QyNTIwMTAudHh0IikKdDI2IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyNi9UMjYyMDEwLnR4dCIpCnQyNyA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjcvVDI3MjAxMC50eHQiKQp0MjggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDI4L1QyODIwMTAudHh0IikKYGBgCgpgYGB7cn0KZ2dwbG90KHQyMykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuNSkKCmdncGxvdCh0MjQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAzLCB4bWF4ID0gMTUsIHltaW4gPSA4LCB5bWF4ID0gMTAsIGFscGhhID0gLjIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAyMCwgeG1heCA9IDM1LCB5bWluID0gOCwgeW1heCA9IDEwLCBhbHBoYSA9IC4zKSsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSA0MCwgeG1heCA9IDU1LCB5bWluID0gOCwgeW1heCA9IDEwLCBhbHBoYSA9IC40KSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gNjAsIHhtYXggPSA3NSwgeW1pbiA9IDgsIHltYXggPSAxMCwgYWxwaGEgPSAuMSwgZmlsbCA9ICJyZWQiKQoKZ2dwbG90KHQyNSkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKZ2dwbG90KHQyNikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKZGlzdCA8LSBkYXRhLmZyYW1lKGRpc3QgPSAgYyhyZXAoIjAiLCAzMyksIHJlcCgiMC4xIiwgNjcpLCByZXAoIjAuMiIsIDUzKSkpCnQyNl90ZXN0IDwtIGJpbmRfY29scyh0MjYsIGRpc3QpCgoKCgoKbGlicmFyeShkcGx5cikKCnQyNSU+JWZpbHRlcihPMiA8IDggKSAtPnQyNl9hCnQyNiU+JWZpbHRlcihPMiA8IDggKSAtPnQyNl9hCgoKZ2dwbG90KHQyNl9hKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrIAogIGdlb21fcmVjdCh4bWluID0gLTUwLCB4bWF4ID0gNTAsIHltaW4gPSAwLCB5bWF4ID0gMTIsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpCgoKZ2dwbG90KHQyNykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKCmdncGxvdCh0MjgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSA1MCwgeW1pbiA9IDAsIHltYXggPSAxMiwgZmlsbCA9ICJSZWQiLCAgYWxwaGEgPSAwLjAwNSkKCgpgYGAKCiogdW4gZGVsdGEgZGUgdGVtcHMgZGUgMjUgc2VjIGVzdCB0cm9wIGNvdXJ0IHF1ZSBwb3VyIHBlcm1ldHRyZSB1bmUgc3RhYmlsaXNhdGlvbi4gZXggdDIzIGlsIGZhdXQgZXRyZSAgYXUgZGVsYSBkZSAzMDAgw6AgNTAwICRcbXUgbSQgIHBvdXIgw6p0cmUgZGVob3JzIGRlIGwnaW5mbHVlbmNlIGRlIGxhIHByb2R1Y3Rpb24gZGUgbCdob2xvYmlvbnRlLiAKCgojIHRlc3QgbHVtacOocmUgT04vT0ZGIHN1ciBjb2Vub3NhcmMKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDI5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyOS9UMjkyMDEwLnR4dCIpCnQzMCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzAvVDMwMjAxMC50eHQiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QodDI5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKIyBuZSBkb25uZSBwYXMgZ3JhbmQgY2hvc2UgZCdleHBsb2l0YWJsZQpnZ3Bsb3QodDMwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKIyBuZSBkb25uZSBwYXMgZ3JhbmQgY2hvc2UgZCdleHBsb2l0YWJsZQpgYGAKCgpgYGB7cn0KdDMxIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzMS9UMzEyNzEwLnR4dCIpCnQzNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzQvVDM0MjcxMC50eHQiKQpgYGAKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpnZ3Bsb3QodDMxKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKCnQzMSU+JWZpbHRlcih0aW1lID4gMTIwICwgdGltZSA8MjAwKSAtPiB0X3Rlc3QKCmdncGxvdCh0X3Rlc3QpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKQoKZ2dwbG90KHRfdGVzdCkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBsb2coTzIpKSkKCmxpYnJhcnkoImRwbHlyIikKCnRfdGVzdCU+JW11dGF0ZShsb2dfTzIgPSBsb2coTzIpKSAtPnRfdGVzdApzdW1tYXJ5KGxtLiA8LSBsbShsb2dfTzIgfiB0aW1lLCBkYXRhID0gdF90ZXN0KSkKCgpsbS4gJT4lIChmdW5jdGlvbihsbSwgbW9kZWwgPSBsbVtbIm1vZGVsIl1dLCB2YXJzID0gbmFtZXMobW9kZWwpKQogIGdncGxvdChtb2RlbCwgYWVzX3N0cmluZyh4ID0gdmFyc1syXSwgeSA9IHZhcnNbMV0pKSArCiAgICBnZW9tX3BvaW50KCkgKyBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgpKQoKbG0uICU+JSBxcGxvdCguZml0dGVkLCAucmVzaWQsIGRhdGEgPSAuKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKwogIHlsYWIoIlJlc2lkdWFscyIpICsKICBnZ3RpdGxlKCJSZXNpZHVhbHMgdnMgRml0dGVkIikKCiNwbG90KGxtLiwgd2hpY2ggPSAyKQpsbS4gJT4lIHFwbG90KHNhbXBsZSA9IC5zdGRyZXNpZCwgZGF0YSA9IC4pICsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsIGNvbG91ciA9ICJkYXJrZ3JheSIpICsKICB4bGFiKCJUaGVvcmV0aWNhbCBxdWFudGlsZXMiKSArCiAgeWxhYigiU3RhbmRhcmRpemVkIHJlc2lkdWFscyIpICsKICBnZ3RpdGxlKCJOb3JtYWwgUS1RIikKCiNwbG90KGxtLiwgd2hpY2ggPSAzKQpsbS4gJT4lIHFwbG90KC5maXR0ZWQsIHNxcnQoYWJzKC5zdGRyZXNpZCkpLCBkYXRhID0gLikgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKwogIHlsYWIoZXhwcmVzc2lvbihib2xkKHNxcnQoYWJzKCJTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIikpKSkpICsKICBnZ3RpdGxlKCJTY2FsZS1Mb2NhdGlvbiIpCgpnZ3Bsb3QodDM0KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MzUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDM1L1QzNTI3MTAudHh0IikKdDM2IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzNi9UMzYyNzEwLnR4dCIpCnQzNyA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzcvVDM3MjcxMC50eHQiKQp0MzggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDM4L1QzODI3MTAudHh0IikKdDM5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzOS9UMzkyNzEwLnR4dCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QodDM1KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKI2dncGxvdCh0MzYpKwojICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKZ2dwbG90KHQzNykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpCmdncGxvdCh0MzgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKQpnZ3Bsb3QodDM5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKCmBgYAoKIyBMJ2V4cMOpcmllbmNlIHJlY29tbWVuY2Ugw6AgesOpcm8KCkFwcsOocyBzJ8OqdHJlIGFwcGVyw6d1IHF1ZSBsJ29uIGTDqXBsYcOnYWl0IGxhIHNvbmRlIGRlIDFtbSBhdSBsaWV1IGRlIDEwMCAkXG11IG0kLCBvbiByZWxhbmNlIGwnZXhww6lyaWVuY2UKCmBgYHtyfQp0NDAgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q0MC9UNDAudHh0IikKCnQ0MiA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDQyL1Q0MjAzMTEudHh0IikKbGlicmFyeSh0aWR5dmVyc2UpCmdncGxvdCh0NDApKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmBgYAoKUHJlbWnDqHJlIGNyaXRpcXVlIGRlIGwnZXhww6lyaWVuY2UsIG9uIHBldXQgb2JzZXJ2ZXIgcXVlIG5vdXMgYXZvbnMgdW5lIHByZW1pw6hyZSBwYXJ0aWUgZHUgZ3JhcGhpcXVlIGNvbnRpbnUgc3VyIGVudmlyb24gMzAwIHNlY29uZGUgKCBldCBkb25jICQyMDAgXG11IG0kKXF1aSBwb3VycmFpdCDDqnRyZSBpbnRlcnByw6l0w6kgY29tbWUgdW5lIGNvdWNoZSBkJ2VhdSBzdGFnbmFudGUgZW50b3VyYW50IGxlIGNvcmFpbC4gTCfDqXRhcGUgc3VpdmFudGUgZXN0IGRlIHLDqWFsaXNlciDDoCBub3V2ZWF1IGNldHRlIGV4cMOpcmllbmNlIGV0IGRlIGxhIGZhaXJlIGRhbnMgbGUgc2VucyBjb250cmFpcmUgcG91ciBhdmFuY2VyIHZlcnMgbGUgY29yYWlsCgpgYGB7cn0KdDQyJT4lZmlsdGVyKHRlbXBzIDwgNzIwKS0+dDQyCmdncGxvdCh0NDIpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyg1MDAsIDcyMCkpCmBgYAoKUHJlbWnDqHJlIHJlbWFycXVlIHN1ciBsJ2V4cMOpcmllbmNlIGVuIHBhcnRhbnQgZHUgbWlsaWV1IGV0IGVuIGF2YW5jYW50IHZlcnMgbGUgY29lbm9zYXJjLCBvbiBvYnNlcnZlIHVuIGF1Z21lbnRhdGlvbiBwcm9ncmVzc2l2ZSBkZSBsJ294eWfDqG5lIHB1aXMgb24gYXR0ZWludCB1biBwcmVtaWVyIHBsYXRlYXUgbG9yc3F1ZSBsYSBzb25kZSB0b3VjaGUgbGUgY29lbm9zYXJjIGV0IHF1ZSBsYSBjb25jZW50cmF0aW9uIHLDqWF1Z21lbnRlIGxvcnNxdWUgbCdvbiB0b3VjaGUgcMOpbmV0cmUgbGVzIHRpc3N1cy4gSWwgc2VtYmxlIGNlcGVuZGF0IHF1J3VuIHNvcnRlIGRlIGNvdWNoZSBzdGFibGUgc2Ugc2l0dWEgw6AgcHJveGltaXTDqSBkdSBjb2Vub3NhcmMgKCB0b3VjaGUgYXUgdmlzdWVsbGUgw6AgNTAwIHNlY29uZGVzKQoKCgpgYGB7cn0KdDQzIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNDMvVDQzMDMxMS50eHQiKQp0NDMkbnVtIDwtYXMubnVtZXJpYyh0NDMkRGF0ZSkKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQpUNDMwMzExX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL1Q0My9UNDMwMzExX2xpZ2h0LmNzdiIpClQ0MzAzMTFfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT5UNDMwMzExX2xpZ2h0ClQ0MzAzMTFfbGlnaHQkbnVtIDwtYXMubnVtZXJpYyhUNDMwMzExX2xpZ2h0JERhdGUpCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDQzX3Rlc3QgPC0gbGVmdF9qb2luKHQ0MywgVDQzMDMxMV9saWdodCwgYnkgPSAibnVtIikKCiNWaWV3KFQ0MzAzMTFfbGlnaHQpCgoKbGlicmFyeShsdWJyaWRhdGUpClQ0MzAzMTFfbGlnaHQgJT4lIHNlcGFyYXRlKGNvbCA9IERhdGUsaW50byA9IGMoInllYXIiLCAiaG91ciIpLCBzZXAgPSAiICIsIHJlbW92ZSA9IEZBTFNFKSAtPiBUNDMwMzExX2xpZ2h0Cgp0NDMgJT4lIHNlcGFyYXRlKGNvbCA9IERhdGUsaW50byA9IGMoInllYXIiLCAiaG91ciIpLCBzZXAgPSAiICIsIHJlbW92ZSA9IEZBTFNFKSAtPiB0NDMKCnQ0M190ZXN0IDwtIGxlZnRfam9pbih0NDMsIFQ0MzAzMTFfbGlnaHQsIGJ5ID0gImhvdXIiKQp0NDNfdGVzdCAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50NDNfdGVzdAp0NDNfdGVzdCRsaWdodFtpcy5uYSh0NDNfdGVzdCRsaWdodCldIDwtIDEKdDQzX3Rlc3QkbGlnaHQgPC0gYXMuZmFjdG9yKHQ0M190ZXN0JGxpZ2h0KQoKZ2dwbG90KGRhdGEgPSB0NDNfdGVzdCwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkgKwogIHRoZW1lX2J3KCkKCgoKYGBgCgoKYGBge3J9CnQ0NSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDQ1L1Q0NTA3MTEudHh0IikKdDQ2IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNDYvVDQ2MDcxMS50eHQiKQp0NDUgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q0NS9UNDUwNzExLnR4dCIpCgp0NTMgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q1My9UNTMxMDExLnR4dCIpCnQ1NCA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDU0L1Q1NDEwMTEudHh0IikKdDU1IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNTUvVDU1MTAxMS50eHQiKQoKdDU3IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNTcvVDU3MTMxMS50eHQiKQp0NTggPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q1OC9UNTgxMzExLnR4dCIpCgp0NjAgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q2MC9UNjAxMzExLnR4dCIpCnQ2MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDYxL1Q2MTEzMTEudHh0IikKCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmdncGxvdCh0NDUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKZ2dwbG90KHQ0NikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKQoKCmdncGxvdCh0NTMpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTcpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCgpnZ3Bsb3QodDYwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMikpCgoKCmdncGxvdCh0NjEpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgdGhlbWVfYncoKQpgYGAKCiMgRXhww6lyaWVuY2UgZHUgMTEgZMOpY2VtYnJlIDIwMTcgCgoqIFV0aWxpc2F0aW9uIGRlIGxhIG5vdXZlbGxlIHNvbmRlIMOgIMOpbGVjdHJvZGUKCk9uIG9ic2VydmUgcXVlIGwndXRpbGlzYXRpb24gZCd1bmUgbm91dmVsbGUgbWljcm/DqWxlY3Ryb2RlIHBlcm1ldCBkJ29idGVuaXIgdW4gc2lnbmFsIHBsdXMgbmV0dGUuCgojIyBFeHBlcmllbmNlIDcwCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ3MCA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDcwL1Q3MDExMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0NzAkdGltZSA8LWFzLmNoYXJhY3Rlcih0NzAkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgClQ3MF9saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS9UNzAvbGlnaHQuY3N2IikKVDcwX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+VDcwX2xpZ2h0ClQ3MF9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3RlcihUNzBfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3MF9jb21iIDwtIGxlZnRfam9pbih0NzAsIFQ3MF9saWdodCwgYnkgPSAidGltZSIpCnQ3MF9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3MF9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzBfY29tYiRsaWdodFtpcy5uYSh0NzBfY29tYiRsaWdodCldIDwtIDEKdDcwX2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3MF9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDcwX2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKKiBPbiBhIHVuIGJlYXUgc2lnbmFsCiogT24gcGV1dCByw6lkdWlyZSBsZSB0ZW1wcyBhdmFudCBkZSBkw6lidXRlciBsYSBtYW5pcCDDoCAyMCBzZWNvbmRlcyBldCBwbHVzIDUwIHNlY29uZGVzCiogT24gcGV1dCByw6lkdWlyZSBsZSB0ZW1wcyBkJ8OpY2xhaXJhZ2Ugw6AgMTUgc2Vjb25kZXMgZXQgcGx1cyAzMCBzZWNvbmRlcwoKIyMgNzEgCgoqIHBlcnRlIGR1IGZpY2hpZXIgc3VyIGxhIGx1bWnDqHJlCgpgYGB7cn0KI2ltcG9ydGF0aW9uCnQ3MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDcxL1Q3MTExMTIudHh0IikKZ2dwbG90KGRhdGEgPSB0NzEsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQpgYGAKCgoKIyMgNzIgCgoKKiBJbCB5IGEgdW4gcHJvYmxlbWUgZW50cmUgbCdlY2xhaXJhZ2UgZXQgbGEgbWljcm/DqWxlY3Ryb2RlIMOgIHZvaXIKCgpgYGB7cn0KI3BhY2thZ2UgZW1wbG95w6kgZHVyYW50IGwnYW5hbHlzZQoKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCgojaW1wb3J0YXRpb24KdDcyIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90NzIvdDcyMTExMi50eHQiKQojY3JlYXRpb24gZCd1bmUgbm91dmVsbGUgdmFyaWFibGUgZW4gY2hhcmFjdGVyCnQ3MiR0aW1lIDwtYXMuY2hhcmFjdGVyKHQ3MiREYXRlKQoKI2ltcG9ydGF0aW9uIGV0IHRyYW5zZm8gZGUgbGEgZGF0ZSAKdDcyX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL3Q3Mi9saWdodC5jc3YiKQp0NzJfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT50NzJfbGlnaHQKdDcyX2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ3Ml9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDcyX2NvbWIgPC0gbGVmdF9qb2luKHQ3MiwgdDcyX2xpZ2h0LCBieSA9ICJ0aW1lIikKdDcyX2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDcyX2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ3Ml9jb21iJGxpZ2h0W2lzLm5hKHQ3Ml9jb21iJGxpZ2h0KV0gPC0gMQp0NzJfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDcyX2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0NzJfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ3MyA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDczL3Q3MzExMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0NzMkdGltZSA8LWFzLmNoYXJhY3Rlcih0NzMkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgCnQ3M19saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS90NzMvbGlnaHQuY3N2IikKdDczX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+dDczX2xpZ2h0CnQ3M19saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzNfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3M19jb21iIDwtIGxlZnRfam9pbih0NzMsIHQ3M19saWdodCwgYnkgPSAidGltZSIpCnQ3M19jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3M19jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzNfY29tYiRsaWdodFtpcy5uYSh0NzNfY29tYiRsaWdodCldIDwtIDEKdDczX2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3M19jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDczX2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCiMjIHQ3NAoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzQgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3NC90NzQxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc0JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc0JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzRfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc0L2xpZ2h0LmNzdiIpCnQ3NF9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3NF9saWdodAp0NzRfbGlnaHQkdGltZSA8LSBhcy5jaGFyYWN0ZXIodDc0X2xpZ2h0JERhdGUpCgoKI29iamVjdGlmIGZhaXJlIGNvbGxlciBsZSBkb2N1bWVudCBzdXIgbGUgdGVtcHMgZXQgbGUgZG9jdW1lbnQgc3VyIGwnw6ljbGFpcmFnZQp0NzRfY29tYiA8LSBsZWZ0X2pvaW4odDc0LCB0NzRfbGlnaHQsIGJ5ID0gInRpbWUiKQp0NzRfY29tYiAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50NzRfY29tYgoKI3Byb2JsZW1lIHNww6ljaWZpcXVlIMOgIGNlIGpldSBkZSBkb25uw6llcwojcGV0aXRlIGNvcnJlY3Rpb24gc3VwcGzDqW1lbnRhaXJlcyBjYXIgamVzc2ljYSBhIGQnYWJvcmQgbGFuY8OpIGxlIHByb2dyYW1tZSBkZSBsdW1pw6hyZSBhdmFudCBsJ2VucmVnaXN0cmVtZW50IGRlIGxhIHNvbmQKdDc0X2NvbWIkbGlnaHRbaXMubmEodDc0X2NvbWIkbGlnaHQpXSA8LSAxCnQ3NF9jb21iJGxpZ2h0IDwtIGFzLmZhY3Rvcih0NzRfY29tYiRsaWdodCkKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ3NF9jb21iLCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yLCBjb2xvciA9IGxpZ2h0KSkrCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IDEpKQpgYGAKCgojIyB0NzUKCiogZXJyZXVyIHN1ciBsYSByZXByw6lzZW50YXRpb24gZ3JhcGhpcXVlICwgamUgbmUgdm9pcyBwYXMgY29tbWVudCBjb3JyaWdlciBjZWxhCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzUgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3NS90NzUxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc1JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc1JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzVfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc1L2xpZ2h0LmNzdiIpCnQ3NV9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3NV9saWdodAp0NzVfbGlnaHQlPiVtdXRhdGUoRGF0ZSA9IERhdGUgKyAxKSAtPiB0NzVfbGlnaHQKdDc1X2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ3NV9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDc1X2NvbWIgPC0gbGVmdF9qb2luKHQ3NSwgdDc1X2xpZ2h0LCBieSA9ICJ0aW1lIikKdDc1X2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDc1X2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ3NV9jb21iJGxpZ2h0W2lzLm5hKHQ3NV9jb21iJGxpZ2h0KV0gPC0gMQp0NzVfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDc1X2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0NzVfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKCiMjIHQ3NgoKCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzYgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3Ni90NzYxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc2JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc2JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzZfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc2L2xpZ2h0LmNzdiIpCnQ3Nl9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3Nl9saWdodAojdDc2X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc2X2xpZ2h0CnQ3Nl9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzZfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3Nl9jb21iIDwtIGxlZnRfam9pbih0NzYsIHQ3Nl9saWdodCwgYnkgPSAidGltZSIpCnQ3Nl9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3Nl9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzZfY29tYiRsaWdodFtpcy5uYSh0NzZfY29tYiRsaWdodCldIDwtIDEKdDc2X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3Nl9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc2X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKCiMjIHQ3NwoKCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzcgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3Ny90NzcxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc3JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc3JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzdfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc3L2xpZ2h0LmNzdiIpCnQ3N19saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3N19saWdodAojdDc3X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc3X2xpZ2h0CnQ3N19saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzdfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3N19jb21iIDwtIGxlZnRfam9pbih0NzcsIHQ3N19saWdodCwgYnkgPSAidGltZSIpCnQ3N19jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3N19jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzdfY29tYiRsaWdodFtpcy5uYSh0NzdfY29tYiRsaWdodCldIDwtIDEKdDc3X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3N19jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc3X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKIyMgdDc4CgoKKiBKZSBuJ2FpIHBhcyBkZSBmaWNoaWVyIHN1ciBsYSBsdW1pw6hyZQoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzggPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3OC90NzgxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc4JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc4JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzhfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc4L2xpZ2h0LmNzdiIpCnQ3OF9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3OF9saWdodAojdDc4X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc4X2xpZ2h0CnQ3OF9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzhfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3OF9jb21iIDwtIGxlZnRfam9pbih0NzgsIHQ3OF9saWdodCwgYnkgPSAidGltZSIpCnQ3OF9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3OF9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzhfY29tYiRsaWdodFtpcy5uYSh0NzhfY29tYiRsaWdodCldIDwtIDEKdDc4X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3OF9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc4X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKIyBFeHDDqXJpZW5jZSBkdSAxMiBkw6ljZW1icmUgMjAxNyAKCiMjIHQ3OQoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzkgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3OS90NzkxMjEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc5JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc5JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzlfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc5L2xpZ2h0LmNzdiIpCnQ3OV9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3OV9saWdodAojdDc5X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc5X2xpZ2h0CnQ3OV9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzlfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3OV9jb21iIDwtIGxlZnRfam9pbih0NzksIHQ3OV9saWdodCwgYnkgPSAidGltZSIpCnQ3OV9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3OV9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzlfY29tYiRsaWdodFtpcy5uYSh0NzlfY29tYiRsaWdodCldIDwtIDEKdDc5X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3OV9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc5X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgojIyB0ODAKCgpgYGB7cn0KI3BhY2thZ2UgZW1wbG95w6kgZHVyYW50IGwnYW5hbHlzZQoKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCgojaW1wb3J0YXRpb24KdDgwIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90ODAvdDgwMTIxMi50eHQiKQojY3JlYXRpb24gZCd1bmUgbm91dmVsbGUgdmFyaWFibGUgZW4gY2hhcmFjdGVyCnQ4MCR0aW1lIDwtYXMuY2hhcmFjdGVyKHQ4MCREYXRlKQoKI2ltcG9ydGF0aW9uIGV0IHRyYW5zZm8gZGUgbGEgZGF0ZSAKdDgwX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL3Q4MC9saWdodC5jc3YiKQp0ODBfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT50ODBfbGlnaHQKI3Q4MF9saWdodCU+JW11dGF0ZShEYXRlID0gRGF0ZSArIDEpIC0+IHQ4MF9saWdodAp0ODBfbGlnaHQkdGltZSA8LSBhcy5jaGFyYWN0ZXIodDgwX2xpZ2h0JERhdGUpCgoKI29iamVjdGlmIGZhaXJlIGNvbGxlciBsZSBkb2N1bWVudCBzdXIgbGUgdGVtcHMgZXQgbGUgZG9jdW1lbnQgc3VyIGwnw6ljbGFpcmFnZQp0ODBfY29tYiA8LSBsZWZ0X2pvaW4odDgwLCB0ODBfbGlnaHQsIGJ5ID0gInRpbWUiKQp0ODBfY29tYiAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50ODBfY29tYgoKI3Byb2JsZW1lIHNww6ljaWZpcXVlIMOgIGNlIGpldSBkZSBkb25uw6llcwojcGV0aXRlIGNvcnJlY3Rpb24gc3VwcGzDqW1lbnRhaXJlcyBjYXIgamVzc2ljYSBhIGQnYWJvcmQgbGFuY8OpIGxlIHByb2dyYW1tZSBkZSBsdW1pw6hyZSBhdmFudCBsJ2VucmVnaXN0cmVtZW50IGRlIGxhIHNvbmQKdDgwX2NvbWIkbGlnaHRbaXMubmEodDgwX2NvbWIkbGlnaHQpXSA8LSAxCnQ4MF9jb21iJGxpZ2h0IDwtIGFzLmZhY3Rvcih0ODBfY29tYiRsaWdodCkKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ4MF9jb21iLCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yLCBjb2xvciA9IGxpZ2h0KSkrCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IDEpKQpgYGAKCgoKIyMgdDgxCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ4MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDgxL3Q4MTEyMTIudHh0IikKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ4MSwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMikpKwogIGdlb21fbGluZSgpCmBgYAoKCgoKIyMgdDgyCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ4MiA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDgyL3Q4MjEyMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0ODIkdGltZSA8LWFzLmNoYXJhY3Rlcih0ODIkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgCnQ4Ml9saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS90ODIvbGlnaHQuY3N2IikKdDgyX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+dDgyX2xpZ2h0CiN0ODJfbGlnaHQlPiVtdXRhdGUoRGF0ZSA9IERhdGUgKyAxKSAtPiB0ODJfbGlnaHQKdDgyX2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ4Ml9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDgyX2NvbWIgPC0gbGVmdF9qb2luKHQ4MiwgdDgyX2xpZ2h0LCBieSA9ICJ0aW1lIikKdDgyX2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDgyX2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ4Ml9jb21iJGxpZ2h0W2lzLm5hKHQ4Ml9jb21iJGxpZ2h0KV0gPC0gMQp0ODJfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDgyX2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0ODJfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKCgojIHQ4NyBWw6lyaWZpY2F0aW9uIGR1IHByb2ZpbCBlbiBveHlnw6huZQoKCmBgYHtyfQp0ODcgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q4Ny90ODcxOTEyLnR4dCIpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmdncGxvdCh0ODcsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQoKCihtYXgodDg3JHRlbXBzKSkvMTUKCk4gPC0gMTAKcGFzX2RlX2Rpc3RhbmNlIDwtIDQwCmRpc3RhbmNlX2luaXRpYWxlIDwtIC00MDAKcGFzX2RlX3RlbXBzIDwtIDE1CnRlbXBzX2luaXRpYWxlIDwtMjYKCgpuIDwtYygwOk4pCgpkaXN0IDwtIGRhdGFfZnJhbWUobiA9IG4pCgpkaXN0JT4lIG11dGF0ZSh0ZW1wcyA9IChuKnBhc19kZV90ZW1wcykrdGVtcHNfaW5pdGlhbGUpLT5kaXN0CgpkaXN0JT4lbXV0YXRlKGRpc3RhbmNlID0gKG4qcGFzX2RlX2Rpc3RhbmNlKStkaXN0YW5jZV9pbml0aWFsZSktPmRpc3QKCgp0ODckdGVtcHMgPC0gcm91bmQodDg3JHRlbXBzLCBkaWdpdHMgPSAwKQp0ODc8LSBsZWZ0X2pvaW4odDg3LCBkaXN0LCBieSA9ICJ0ZW1wcyIpCnQ4NyA8LSB0aWR5cjo6ZmlsbCh0ODcsIGRpc3RhbmNlLCAuZGlyZWN0aW9uID0gImRvd24iKSAKCgpnZ3Bsb3QodDg3LCBtYXBwaW5nID0gYWVzKHggPSBkaXN0YW5jZSwgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkrCiAgZ2VvbV9zbW9vdGgoKQoKYGBgCgojIHQ4OCBWw6lyaWZpYWN0aW9uIGR1IHByb2ZpbCBzdWl0ZSBkZSB0NzcKCgpgYGB7cn0KdDg4IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90ODgvdDg4MTkxMi50eHQiKQoKbGlicmFyeSh0aWR5dmVyc2UpCgpnZ3Bsb3QodDg4LCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkKCihtYXgodDg4JHRlbXBzKS0yNSkvMTUKCk4gPC0gMzAKcGFzX2RlX2Rpc3RhbmNlIDwtIDEwCmRpc3RhbmNlX2luaXRpYWxlIDwtIC0zMDAKcGFzX2RlX3RlbXBzIDwtIDE1CnRlbXBzX2luaXRpYWxlIDwtMjYKCgpuIDwtYygwOk4pCgpkaXN0IDwtIGRhdGFfZnJhbWUobiA9IG4pCgpkaXN0JT4lIG11dGF0ZSh0ZW1wcyA9IChuKnBhc19kZV90ZW1wcykrdGVtcHNfaW5pdGlhbGUpLT5kaXN0CgpkaXN0JT4lbXV0YXRlKGRpc3RhbmNlID0gKG4qcGFzX2RlX2Rpc3RhbmNlKStkaXN0YW5jZV9pbml0aWFsZSktPmRpc3QKCgp0ODgkdGVtcHMgPC0gcm91bmQodDg4JHRlbXBzLCBkaWdpdHMgPSAwKQoKZGlzdCR0ZW1wcyA8LWFzLmNoYXJhY3RlcihkaXN0JHRlbXBzKQojIyBSZWNvZGFnZSBkZSBkaXN0JHRlbXBzCmRpc3QkdGVtcHMgPC0gcmVjb2RlKGRpc3QkdGVtcHMsCiAgICAgICAgICAgICAgICIyMjEiID0gIjIyMiIsCiAgICAgICAgICAgICAgICIyMzYiID0gIjIzNyIsCiAgICAgICAgICAgICAgICIyNTEiID0gIjI1MiIsCiAgICAgICAgICAgICAgICIyNjYiID0gIjI2NyIsCiAgICAgICAgICAgICAgICIyODEiID0gIjI4MiIsCiAgICAgICAgICAgICAgICIyOTYiID0gIjI5NyIsCiAgICAgICAgICAgICAgICIzMTEiID0gIjMxMiIsCiAgICAgICAgICAgICAgICIzMjYiID0gIjMyNyIpCmRpc3QkdGVtcHMgPC0gYXMubnVtZXJpYyhkaXN0JHRlbXBzKQoKCnQ4ODwtIGxlZnRfam9pbih0ODgsIGRpc3QsIGJ5ID0gInRlbXBzIikKdDg4IDwtIHRpZHlyOjpmaWxsKHQ4OCwgZGlzdGFuY2UsIC5kaXJlY3Rpb24gPSAiZG93biIpIAoKdDg4JGRpc3RfdmVyaWYgPC0gYXMuZmFjdG9yKHQ4OCRkaXN0YW5jZSkKbGV2ZWxzKHQ4OCRkaXN0X3ZlcmlmKQoKZ2dwbG90KHQ4OCwgbWFwcGluZyA9IGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBPMikpKwogIGdlb21fbGluZSgpKwogIGdlb21fc21vb3RoKCkKYGBgCgoKIyB0ODkgdmFyaWF0aW9uIGRlIGwnaW50ZW5zaXTDqSBkZSBsYSBsdW1pw6hyZSAKCmBgYHtyfQp0OTYgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q5Ni85NjIxMTIudHh0IikKCmdncGxvdCh0OTYsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQpgYGAKCg==